在之前我們有介紹過 View 要取得資料會透過 LiveData , 觀察資料是否變動以及 View 是否要更改,那其實還有另外一個方法也可以達到更新 View 的效果,那就是 DataBinding
DataBinding 的功能就是在做 ViewModel 與 View 之間的資料綁定,那這和 LiveData 之間有什麼不同呢?
其實最大的差異就在 LiveData 是會在 Activity
或是 Fragment
以 函式 的型態去做綁定,當 View 收到資料更新的 event 後,會在函式中進行重畫 Layout 、決定元件是否要顯示或是再去 Call 其他函式...等等行為
而 DataBinding 則是直接與 Layout 上的元件 做綁定,舉例來說,假設將 Layout 上的 TextView
和 User 資料
做綁定,那麼當 ViewModel 收到 User 資料改變時,可以不用透過 Activity
或 Fragment
,而是直接讓 TextView 元件顯示的內容做出改變 ,達到 Layout 更新的效果
而也因為 DataBinding 有這樣的能力,也帶來另外的價值就是不再需要寫 findViewById()
過去在寫 Java 的時候若要使用 Layout 上的元件,一定要先幫元件設定一個 id
,接著再用 findViewById()
的方式去取得元件,接著才有操作的能力,因此常常會看到在 onCreate()
的時候寫了一堆取得元件和初始化元件 Code
那想當然爾,就會有人希望可以減少這些用途不大卻很煩瑣的程式碼,因此就會導入 Butter Knife
這個框架去輔助取得元件的過程
然而從 Java 換到 Kotlin 時發現 findViewById()
和 Butter Knife
都不再需要了,因為 Kotlin 本身就有支援 View Binding 的 Extension - kotlinx.android.synthetic,然而這個 Extension 並沒有真正取得 Google 官方的支持,而是在 Google 推出 Jetpack 的時候推荐了 Data Binding Library
儘管 Data Binding Library 原先的用意不是在消滅 findViewById()
,而是做和 Layout 元件的綁定,但這樣的設計方法也順勢解決這個問題,因此只要 Layout 中的元件有加上 id ,那就能透過 binding 找到
那在上一個段落有提到 DataBinding
、 kotlinx.android.synthetic
以及 Butter Knife
都可以解決 findViewById()
,那在實作上選哪個會比較好呢?
這個問題已經由 Andorid Developer Advocate 和 Butter Knife 中的 Readme 給出答案,簡單統整下來我給出以下結論
kotlinx.android.synthetic 並沒有得到官方的 "推荐",但是並不代表他是不好的,因此如果目前已經有在使用,而且並沒有其他需求的話,可以繼續使用他
而 Butter Knife 的時代已經被終結了,如果你打開 Butter Knife 的 Github ,就能在第1行看到 "This tool is now deprecated. Please switch to view binding"
因此可以在 DataBinding 和 kotlinx.android.synthetic 擇一,但如果有資料綁定 Layout 元件的需求就大膽的使用 DataBinding 吧!